package designpatterns.singleton;

/**
 * @author 真香
 * @create 2021-05-27 20:56
 */
public class LazyMan {

    private LazyMan(){

        System.out.println(Thread.currentThread().getName() + "ok");
    }

    private volatile static LazyMan lazyMan;


    // 双重模式检测的 懒汉式 单例 DCL懒汉式
    public static LazyMan getInstance(){

        synchronized (LazyMan.class){
            if (lazyMan == null) {
                // 不是原子性操作

                /**
                 * 1、分配内存空间
                 * 2、执行构造方法 初始化对象
                 * 3、把这个对象指向空间
                 *
                 * 由于CPU执行不一致可能出现 123、132、231
                 * B线程进来判断lazyMan !=null 所以会出错 此时对象上加上volatile
                 */
                lazyMan = new LazyMan();

            }
        }
        //单线程下确实有用
        return lazyMan;
    }

    // 多线程并发测试

    public static void main(String[] args){
        for (int i = 0; i < 10; i++) {
            new Thread(()->{
                getInstance();
            }).start();

        }
    }




}
